﻿#ifndef WRWORKDOMAINLISTMODEL_H
#define WRWORKDOMAINLISTMODEL_H

#include <QEvent>
#include <QModelIndex>
#include <QAbstractItemModel>
#include "../WRSoft-Working-Common/WRWorkDomain.h"
#include "../WRSoft-Utility/WRObjRef.h"

//声明工作域列表模型。
class WRWorkDomainListModel;

//表示工作域列表项目。
class WRWorkDomainListEntry : private WRWorkDomain::Watcher
{
private:
    int m_index;
    WRWorkDomain::Status m_status;
    WRWorkDomain* m_target;
    WRWorkDomainListModel* m_parent;

    //当工作域状态改变后调用此方法，如果为在线状态，则存在会话，否则会话为0。
    void onChanged(WRWorkDomain* domain, WRWorkDomain::Status status, WRWorkSession* session);

public:
    //初始化工作域列表项目。
    WRWorkDomainListEntry(int index, WRWorkDomain* target, WRWorkDomainListModel* parent);
    //清理当前对象所占用的相关资源。
    virtual ~WRWorkDomainListEntry(void);

    //设置为活动。
    void activate(void);
    //设置为不活动。
    void inactivate(void);

    //执行打开操作。
    inline void start()
    {
        m_target->start();
    }
    //执行关闭操作。
    inline void close()
    {
        m_target->close();
    }

    //获取索引号。
    inline int index(void) const
    {
        return m_index;
    }

    //获取目标对象。
    inline WRWorkDomain* target(void) const
    {
        return m_target;
    }

    //获取状态。
    inline WRWorkDomain::Status status(void) const
    {
        return m_status;
    }

    //设置状态。
    inline bool status(WRWorkDomain::Status value)
    {
        if (value != m_status)
        {
            m_status = value;
            return true;
        }
        return false;
    }

    //获取状态文本。
    inline QString statusString(void) const
    {
        return WRText::toString(m_status);
    }

    //获取域的名称。
    inline const QString& title(void) const
    {
        return m_target->title();
    }
    //获取域的描述。
    inline const QString& description(void) const
    {
        return m_target->description();
    }
};

//表示工作域列表模型。
class WRWorkDomainListModel : public QAbstractItemModel
{
    Q_OBJECT

private:
    WRArray<WRWorkDomainListEntry*> m_list;

    //清理当前对象所占用的相关资源。
    ~WRWorkDomainListModel(void);

public:
    //初始化工作域列表模型。
    explicit WRWorkDomainListModel(const WRObjRef<WRWorkDaemon>& daemon);

    //设置为活动。
    void activate(void);
    //设置为不活动。
    void inactivate(void);

    //获取数量。
    inline int count(void) const
    {
        return (WR32s)m_list.count();
    }
    //获取指定行的项目。
    inline WRWorkDomainListEntry* index(int row) const
    {
        return m_list[row];
    }

    //处理事件。
    bool event(QEvent *);

    //判断是否存在索引。
    bool hasIndex(int row, int column, const QModelIndex &parent = QModelIndex());

    //获取索引。
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;

    //获取父索引。
    QModelIndex parent(const QModelIndex &child) const;

    //获取行数量。
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    //获取列数量。
    int columnCount(const QModelIndex &parent = QModelIndex()) const;

    //判断是否具有子级。
    bool hasChildren(const QModelIndex & parent = QModelIndex()) const;

    //获取内容数据。
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    //获取标题数据。
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
};

#endif // WRWORKDOMAINLISTMODEL_H
